#include<stdio.h>
#include<unistd.h>
#include"ohos_init.h"
#include"cmsis_os2.h"
//定义全局变量表示定时器回调次数
static int times=0;
//定时器跟线程一样 也需要创建 创建的时候也需要指定定时器的执行函数 根线程一样 但不是线程
//本次demo是在入口函数创建一个线程  执行函数为test_thread 
//线程执行函数里面创建定时器
//创建定时器的时候设置定时器的回调函数(回调函数就是定时器的执行函数) timerback
//然后设置回调周期 就是多少秒回调一次回调函数

//回调函数
void time_back(void *arg)
{
    (void)arg;//处理未使用变量
    //调用一次回调函数 times++
    times++;
    printf("now the times is %d\n",times);
}
//定义线程执行函数 里面创建定时器
void test_thread(void *arg)
{
    osDelay(100);
    (void)arg;
    //创建一个定时器 
    //成功则返回创建的定时器的id
     // osTimerOnce：一次性的
    // osTimerPeriodic：周期性的
    osTimerId_t id=osTimerNew(time_back,osTimerPeriodic,NULL,NULL);//osTimerPeriodic设置为周期定时器
    if(id==NULL)
    {
        printf("timer create fail\n");
        return;
    }else{
        //在C语言中，%p 是用来格式化和打印指针的格式控制符。它用于将指针的地址以十六进制形式输出。
        printf("timer create success , timerid is %p\n",id);
    }
    //创建定时器成功之后 
    //定时器开启 设置多久执行一次定时器的回调函数
    osStatus_t status=osTimerStart(id,100);//参数为定时器的id 每100个tick执行一次一个tick是10ms 1000ms=1s
    if(status!=osOK)
    {
        printf("osTimerStart is fail\n");
        return ;
    }else{
        printf("osTimerStart is success\n");
    }
    //上面定时器设置1秒调用一次回调函数
    //等5秒 定时器回调函数 执行5次
    osDelay(500);
    if(times>5)
    {
        printf("times is more 5 and times is %d\n",times);
    }
    //执行5次之后停止定时器
    status=osTimerStop(id);//返回0 1
    printf("after stopTimer the status is %d\n",status);
    //删除定时器
    status=osTimerDelete(id);
    printf("after deleteTimer the status is %d\n",status);
}
static void entryy(void)
{
   // 线程属性
    osThreadAttr_t attr;
    attr.name = "timer_periodic";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = osPriorityNormal;
    if(osThreadNew((osThreadFunc_t)test_thread,NULL,&attr)==NULL){
        printf("thread is success create\n");
    }
}
APP_FEATURE_INIT(entryy);



